package chixing.day15;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 文件的操作
 * java.io.File : 文件夹，文件
 * directory : 目录
 * path 路径
 */
public class FileDemo {
    public static void main(String[] args) throws IOException {
     File f = new File("D:\\a\\b");
     f.mkdir();
     File f1 = new File("D:\\a\\b\\c.txt");
     try {
         boolean newFile = f1.createNewFile();
     } catch (IOException e) {
         throw new RuntimeException(e);
     }
/*        //获得file1,file2 文件的名称
        System.out.println(f1.getName());
        //获得file1,file2 文件的路径
        System.out.println(f1.getPath());
        //判断file1 是不是文件夹
        System.out.println(f1.isDirectory());
        //判断file2 是不是文件
        System.out.println(f1.isFile());
        //获得file1父文件夹的名称
        System.out.println(f1.getParent());
        //获得file1父文件夹的对象
        System.out.println(f1.getParentFile());


        // 这是一个文件夹路径，下面有其他子文件夹或子文件
        File file3 = new File("D:\\j01\\workspace");
        //获得 file3下面的其他子文件 (夹) 对象
        File[] files = file3.listFiles();
        for (File file : files) {
            System.out.println(file.getName());
        }*/
//        File searchFile = searchFile("D:\\j01\\workspace", "a.txt");
//        System.out.println(searchFile);
        List<File> allSubFiles = getAllSubFiles("D:\\j01");
        for (File file : allSubFiles) {
            System.out.println(file);
        }
    }
    /**
     * 在指定的目录下查找文件
     *  @param path 指定的目录
     * @param fileName 要查找到文件的名称
     * @return 若找到该文件，则返回该文件对象，若没有找到该文件，则返回null
     */
    public static File searchFile(String path,String fileName){
        File file = new File(path);
        File[] files1 = file.listFiles();
        for (File f : files1) {
            if(f.isFile()&&f.getName().equals(fileName)){
                return f;
            }

        }
        return null;

    }

    /**
     * 获得指定目录下的所有的子文件，若子文件对象是文件夹，则继续遍历 直到是子文件对象
     * 注意判断是文件夹还是文件， 以及空文件夹的处理
     * @param path 指定目录
     * @return 返回所有的子文件对象集合
     */
    public static File[] getAllFiles(String path){
        File file = new File(path);
        File[] files = file.listFiles();
        List<File> allFiles = new ArrayList<>();

        for (File f : files) {
            if (f.isDirectory()) {
                File[] subFiles = getAllFiles(f.getPath());
                for (File subFile : subFiles) {
                    allFiles.add(subFile);
                }
            } else if (f.isFile()) {
                allFiles.add(f);
            }
        }

        return allFiles.toArray(new File[0]);
    }
    private static List<File> fileList = new ArrayList<>();
    public static List<File> getAllSubFiles(String path){
        File file = new File(path);
        //1. path不能是文件  ||  不能是空文件夹
        if(file.isFile() )
            return null;

        File[] subFiles = file.listFiles();
        if(subFiles ==null || subFiles.length==0)
            return null;

        //2. 获得所有的子文件， 需要依次遍历子文件对象 ，
        for(File subFile:subFiles){
            //3.若是文件isFile(), 添加集合；否则(是文件夹) , 继续获得该子文件夹里面的文件 。。。。。递归
            if(subFile.isFile()) {
                //System.out.println(subFile.getAbsolutePath());
                fileList.add(subFile);
            }else //子文件对象是文件夹
                getAllSubFiles(subFile.getPath());
        }

        return fileList;
    }
}
